﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using DigDes.DS2012.DataLoader.Contracts;
using System.IO;
using DigDes.DS2012.Infrastructure;
using System.Reflection;

namespace DigDes.DS2012.DataLoader
{
    public class DataLoadManager
    {
        /// <summary>
        /// Здесь хранится каталог с загрузичками из файла настроек проекта.
        /// </summary>
        private string _loadersFolder;

        /// <summary>
        /// Контейнер, в котором производится композиция.
        /// </summary>
        private CompositionContainer _container;

        /// <summary>
        /// Конструктор. Пока ничего не делает.
        /// </summary>
        public DataLoadManager()
        {
            _loadersFolder = AppConfig.DataLoadersFolder;
        }

        /// <summary>
        /// Здесь создается контейнер, в котором будет происходить композиция.
        /// </summary>
        public void ImportLoaders()
        {
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new DirectoryCatalog(
                Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), _loadersFolder)));

            _container = new CompositionContainer(catalog);

            try
            {
                _container.ComposeParts(this);
            }
            catch (CompositionException)
            {

            }
            catch (Exception)
            {

            }
        }

        /// <summary>
        /// Список загрузчиков. Формируется средствами MEF.
        /// </summary>
        [ImportMany]
        private IEnumerable<ILoader> _loaders;
        
        /// <summary>
        /// Эта функция загружает файл в БД, используя подходящий загрузчик.
        /// </summary>
        /// <param name="bytes"></param>
        public void LoadData(string fileName, byte[] fileData)
        {
            foreach (ILoader loader in _loaders)
            {
                if (loader.CanLoadData(fileName, fileData))
                {
                    loader.LoadData(fileName, fileData);

                    return;
                }
            }
        }
    }
}
